Análisis de Datos I
Tarea 11
Pregunta 1
Complete las demostraciones de los Teoremas 2 y 4 de la presentación de la clase.
Teorema 2
Teorema 4
Pregunta 2
Diseñe un algoritmo en pseudocódigo para el Método del Análisis Discriminante Lineal según la teoría vista en clase.
// Entrada:
// - X: Matriz de datos de tamaño n por m
// Salida:
// - G: matriz de centros de gravedad de cada clase
// - u: Los factores discriminates
// - lambda : valores propios
//Funcion ADL(X)
// Paso 1: Separar los datos en dos bases
X1 = datos con m_1 variables númericas
X2 = código disyuntivo completo de las modalidades de la variable catégorica
// Paso 2: Calcular la matriz diagonal de cantidad de individuos en cada clase
D_G <- diag(n_g)
// Paso 3: Calcular la matriz de centros de gravedades
G = (D_G)^-1*(X2)^t*X1
// Paso 4: Calcular la matriz de la cual se obtienen los factores discriminantes
// y valores propios asociados
FD_matriz <- (X1^t*X1)^-1*G^t*D_G*G
// Paso 5: Obtener los vectores y valores propios de FD_matriz
u <- eigen(FD_matriz)$vectors
lambda <- eigen(FD_matriz)$values
// Devolver matriz de centros de gravedad de cada clase,los factores discriminates
// y valores propios
devolver G, u, lambda
//Fin Funcion
// Uso del modelo para clasificación:
// Funcion ADL(X)
// Proyectar los nuevos datos
proyeccion = w^T * X_nuevo
// Determinar la clase basada en la cercanía a las medias proyectadas
Si abs(proyeccion - m0) < abs(proyeccion - m1) entonces
devolver 0
Sino
devolver 1
Pregunta 4
Con las definiciones anteriores pruebe lo siguiente: Si V;VB;VW son las matrices de covarianza total, inter-clase intra-clase, respectivamente, entonces:
1. V = VB + VW
2. \(\sum_{s=1}^rq_sg_s =
0\). Es decir, \(rang(C_g) \leq
r-1\)
3. \(rang(C_g) =
rang(V_B)\)
Además, para la tabla de datos Ejemplo AD.csv calcule: gA, gB, gC, V, VB, VW y verifique que V = VB + VW
Primeramente, se carga la base de datos
Ejemplo_AD <-read.csv("Ejemplo_AD.csv",sep = ";",dec='.',header=T,row.names = 1,stringsAsFactors = T)Las columnas de variables númericas deben estar centradas, por lo que, la media de cada una debe ser cero. Verifiquemos si lo están:
## RT1 RT2 RT3 RT4 RT5
## 7.213333 5.746667 1.950000 0.710000 21.740000
Se puede observar que las medias de cada columna númerica son diferente de cero, por lo que, debemos centrarlos de la siguiente manera:
for(i in 1: (ncol(Ejemplo_AD)-1)) {
Ejemplo_AD[,i] <- Ejemplo_AD[,i]-mean(Ejemplo_AD[,i])
}
head(Ejemplo_AD)## RT1 RT2 RT3 RT4 RT5 VC
## A1 1.7866667 -1.1466667 0.05 -0.61 4.06 A
## B1 -3.2133333 -2.4466667 -1.55 -0.11 10.66 B
## C1 -5.8133333 -4.7466667 -0.85 -0.21 1.76 C
## A2 2.7866667 0.9533333 1.95 -0.51 -6.04 A
## B2 0.9866667 0.4533333 0.15 -0.51 -4.74 B
## C2 -4.7133333 -0.3466667 -1.15 -0.31 -5.44 C
Se obtienen los dos juegos de datos con las que se trabajan, la primera con variables númericas y la segunda con el código disyuntivo completo de las modalidades de la variable categórica.
## RT1 RT2 RT3 RT4 RT5
## A1 1.7866667 -1.1466667 0.05 -0.61 4.06
## B1 -3.2133333 -2.4466667 -1.55 -0.11 10.66
## C1 -5.8133333 -4.7466667 -0.85 -0.21 1.76
## A2 2.7866667 0.9533333 1.95 -0.51 -6.04
## B2 0.9866667 0.4533333 0.15 -0.51 -4.74
## C2 -4.7133333 -0.3466667 -1.15 -0.31 -5.44
El segundo juego de datos es:
# Datos con las variables categóricas
VC.A <- as.numeric(Ejemplo_AD$VC == "A")
VC.B <- as.numeric(Ejemplo_AD$VC == "B")
VC.C <- as.numeric(Ejemplo_AD$VC == "C")
X2 <- cbind(VC.A,VC.B,VC.C)
head(X2)## VC.A VC.B VC.C
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
## [4,] 1 0 0
## [5,] 0 1 0
## [6,] 0 0 1
Luego, se calcula matriz \(D_g\) diagonal del número de individuos en cada modalidad.
##
## A B C
## A 10 0 0
## B 0 10 0
## C 0 0 10
Ahora, se obtienen los centros de gravedad de A, B y C.
\(g_A\)
## RT1 RT2 RT3 RT4 RT5
## 3.6866667 0.8433333 1.3400000 -0.3500000 -0.4000000
\(g_B\)
## RT1 RT2 RT3 RT4 RT5
## -0.51333333 0.09333333 -0.21000000 0.25000000 0.48000000
\(g_C\)
## RT1 RT2 RT3 RT4 RT5
## -3.1733333 -0.9366667 -1.1300000 0.1000000 -0.0800000
Seguido, se procede a calcular la matriz de covarianzas total \(V\).
# Matriz de pesos del conjuntos de individuos de la matriz X1
peso <-1/nrow(X1)
pesos_ind <- diag(peso, nrow(X1))
V <- t(X1)%*%pesos_ind %*%X1
kable_styling(kable(V))| RT1 | RT2 | RT3 | RT4 | RT5 | |
|---|---|---|---|---|---|
| RT1 | 10.8924889 | 1.1097111 | 3.328667 | -0.6114667 | -3.081200 |
| RT2 | 1.1097111 | 10.8398222 | 2.405000 | 0.4715333 | -4.521533 |
| RT3 | 3.3286667 | 2.4050000 | 1.915833 | -0.1175000 | -2.416667 |
| RT4 | -0.6114667 | 0.4715333 | -0.117500 | 0.5929000 | 1.017933 |
| RT5 | -3.0812000 | -4.5215333 | -2.416667 | 1.0179333 | 17.267067 |
La matriz de covarianzas inter-clase \(V_B\) es:
# Matriz diagonal de pesos de las 3 clases
pesos_clases <- D_G*peso
VB <- t(G)%*%pesos_clases%*%G
kable_styling(kable(VB))| RT1 | RT2 | RT3 | RT4 | RT5 | |
|---|---|---|---|---|---|
| RT1 | 7.9750222 | 2.0111778 | 2.8779333 | -0.5786667 | -0.4890667 |
| RT2 | 2.0111778 | 0.5324222 | 0.7229667 | -0.1218333 | -0.0725333 |
| RT3 | 2.8779333 | 0.7229667 | 1.0388667 | -0.2115000 | -0.1821333 |
| RT4 | -0.5786667 | -0.1218333 | -0.2115000 | 0.0650000 | 0.0840000 |
| RT5 | -0.4890667 | -0.0725333 | -0.1821333 | 0.0840000 | 0.1322667 |
La matriz de covarianzas intra-clase \(V_W\) es:
clases <- unique(Ejemplo_AD$VC)
# Se calcula la matriz VW
VW <- matrix(0, nrow = 5, ncol = 5)
for(i in (1:length(clases))) {
clase <- Ejemplo_AD[Ejemplo_AD$VC == clases[i], -6]
n <- nrow(clase)
# Calcular la suma para la clase actual
suma <- matrix(0, nrow = 5, ncol = 5)
for(j in 1: n){
xi_minus_g <- as.numeric(clase[j,] - G[i,])
suma <- suma + xi_minus_g%*%t(xi_minus_g)
}
VW <- VW + suma
}
VW <- peso*VW
kable_styling(kable(VW))| 2.9174667 | -0.9014667 | 0.4507333 | -0.0328000 | -2.5921333 |
| -0.9014667 | 10.3074000 | 1.6820333 | 0.5933667 | -4.4490000 |
| 0.4507333 | 1.6820333 | 0.8769667 | 0.0940000 | -2.2345333 |
| -0.0328000 | 0.5933667 | 0.0940000 | 0.5279000 | 0.9339333 |
| -2.5921333 | -4.4490000 | -2.2345333 | 0.9339333 | 17.1348000 |
Verificamos que se cumple \(V = V_B+V_W\).
| RT1 | RT2 | RT3 | RT4 | RT5 | |
|---|---|---|---|---|---|
| RT1 | 10.8924889 | 1.1097111 | 3.328667 | -0.6114667 | -3.081200 |
| RT2 | 1.1097111 | 10.8398222 | 2.405000 | 0.4715333 | -4.521533 |
| RT3 | 3.3286667 | 2.4050000 | 1.915833 | -0.1175000 | -2.416667 |
| RT4 | -0.6114667 | 0.4715333 | -0.117500 | 0.5929000 | 1.017933 |
| RT5 | -3.0812000 | -4.5215333 | -2.416667 | 1.0179333 | 17.267067 |
Se puede notar que la suma de esas matrices es igual a \(V\).